home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 23 / AMIGAplus Sonderheft 23 (2000)(Falke)(DE)[!].iso / Updates / Datatypes / RGFX-DT / Source / libbase.c < prev    next >
C/C++ Source or Header  |  1999-11-14  |  4KB  |  206 lines

  1. #include <clib/alib_protos.h>
  2. #include <pragma/exec_lib.h>
  3. #include <pragma/intuition_lib.h>
  4. #include <dos/dos.h>
  5. #include <exec/resident.h>
  6. #include "class.h"
  7.  
  8. #define VERSION 43
  9. #define REVISION 12
  10.  
  11. struct ClassBase:Library
  12. {
  13. BPTR cb_SegList;
  14. IClass *cb_Class;
  15. SignalSemaphore cb_Lock;
  16. };
  17.  
  18. extern APTR Dispatcher;
  19. extern ULONG InitTab[];
  20. extern APTR LibVectors[];
  21. extern char LibName[];
  22. extern char LibId[];
  23.  
  24. ClassBase *LibInit(register __a0 ULONG Segment,register __d0 ClassBase *cb,register __a6 Library *sysbase);
  25. ClassBase *LibOpen(register __a6 ClassBase *cb);
  26. ULONG LibClose(register __a6 ClassBase *cb);
  27. ULONG LibExpunge(register __a6 ClassBase *cb);
  28. IClass *ObtainClass(register __a6 ClassBase *cb);
  29.  
  30. BOOL L_OpenLibs();
  31. void L_CloseLibs();
  32. IClass *InitClass(ClassBase *cb);
  33.  
  34. static LONG LibExtFunc()
  35. {
  36. return -1;
  37. }
  38.  
  39. static Resident RomTag=
  40. {
  41. RTC_MATCHWORD,
  42. &RomTag,
  43. &RomTag+sizeof(RomTag),
  44. RTF_AUTOINIT,
  45. VERSION,
  46. NT_LIBRARY,
  47. 0,
  48. LibName,
  49. LibId,
  50. &InitTab
  51. };
  52.  
  53. char LibName[]="rgfx.datatype";
  54. char LibId[]="$VER:rgfx.datatype 43.12 (13.11.99) © 1997-99 by Achim Stegemann\n";
  55.  
  56. APTR LibVectors[]=
  57. {
  58. LibOpen,
  59. LibClose,
  60. LibExpunge,
  61. LibExtFunc,
  62. ObtainClass,
  63. APTR(-1),
  64. };
  65.  
  66. ULONG InitTab[]=
  67. {
  68. sizeof(ClassBase),
  69. ULONG(LibVectors),
  70. 0,
  71. ULONG(LibInit)
  72. };
  73.  
  74. Library *SysBase;
  75. Library *DOSBase;
  76. Library *IntuitionBase;
  77. Library *GfxBase;
  78. Library *UtilityBase;
  79. Library *IFFParseBase;
  80. Library *XpkBase;
  81. Library *RenderBase;
  82. Library *DataTypesBase;
  83. Library *SuperClassBase;
  84. Library *CyberGfxBase;
  85.  
  86. ClassBase *LibInit(register __a0 ULONG Segment,register __d0 ClassBase *cb,register __a6 Library *sysbase)
  87. {
  88. SysBase=sysbase;
  89. cb->lib_Revision=REVISION;
  90. cb->cb_SegList=Segment;
  91. InitSemaphore(&cb->cb_Lock);
  92. return cb;
  93. }
  94.  
  95. ClassBase *LibOpen(register __a6 ClassBase *cb)
  96. {
  97. ClassBase *ret=0;
  98. cb->lib_Flags&=~LIBF_DELEXP;
  99. ObtainSemaphore(&cb->cb_Lock);
  100. if(!cb->cb_Class)
  101.     {
  102.     if(L_OpenLibs())
  103.         {
  104.         if(cb->cb_Class=InitClass(cb)) ret=cb;
  105.         }
  106.     }
  107. else ret=cb;
  108. if(ret) cb->lib_OpenCnt++;
  109. ReleaseSemaphore(&cb->cb_Lock);
  110. return ret;
  111. }
  112.  
  113. ULONG LibClose(register __a6 ClassBase *cb)
  114. {
  115. if(cb->lib_OpenCnt) cb->lib_OpenCnt--;
  116. return (!cb->lib_OpenCnt&&cb->lib_Flags&LIBF_DELEXP)?LibExpunge(cb):0;
  117. }
  118.  
  119. ULONG LibExpunge(register __a6 ClassBase *cb)
  120. {
  121. if(!cb->lib_OpenCnt)
  122.     {
  123.     if(cb->cb_Class) 
  124.         {
  125.         if(!FreeClass(cb->cb_Class))
  126.             {
  127.             AddClass(cb->cb_Class);
  128.             return 0;
  129.             }
  130.         }
  131.     L_CloseLibs();
  132.     Remove(cb);
  133.     FreeMem((BYTE *)cb-cb->lib_NegSize,cb->lib_NegSize+cb->lib_PosSize);
  134.     return cb->cb_SegList;
  135.     }
  136. else cb->lib_Flags|=LIBF_DELEXP;
  137. return 0;
  138. }
  139.  
  140. IClass *InitClass(ClassBase *cb)
  141. {
  142. IClass *cl;
  143. if(cl=MakeClass(LibName,"picture.datatype",0,sizeof(Data),0))
  144.     {
  145.     cl->h_Entry=&HookEntry;
  146.     cl->h_SubEntry=&Dispatcher;
  147.     cl->cl_UserData=ULONG(cb);
  148.     AddClass(cl);
  149.     }
  150. return cl;
  151. }
  152.  
  153. BOOL L_OpenLibs()
  154. {
  155. if(DOSBase=OpenLibrary("dos.library",39))
  156.     {
  157.     if(GfxBase=OpenLibrary("graphics.library",39))
  158.         {
  159.         if(IntuitionBase=OpenLibrary("intuition.library",39))
  160.             {
  161.             if(UtilityBase=OpenLibrary("utility.library",39))
  162.                 {
  163.                 if(IFFParseBase=OpenLibrary("iffparse.library",39))
  164.                     {
  165.                     if(DataTypesBase=OpenLibrary("datatypes.library",39))
  166.                         {
  167.                         if(SuperClassBase=OpenLibrary("datatypes/picture.datatype",39))
  168.                             {
  169.                             if(XpkBase=OpenLibrary("xpkmaster.library",5))
  170.                                 {
  171.                                 if(RenderBase=OpenLibrary("render.library",30))
  172.                                     {
  173.                                     CyberGfxBase=OpenLibrary("cybergraphics.library",40);
  174.                                     return 1;
  175.                                     }
  176.                                 }
  177.                             }
  178.                         }
  179.                     }
  180.                 }
  181.             }
  182.         }
  183.     }
  184. L_CloseLibs();
  185. return 0;
  186. }
  187.  
  188. void L_CloseLibs()
  189. {
  190. CloseLibrary(DOSBase);
  191. CloseLibrary(IntuitionBase);
  192. CloseLibrary(GfxBase);
  193. CloseLibrary(UtilityBase);
  194. CloseLibrary(IFFParseBase);
  195. CloseLibrary(DataTypesBase);
  196. CloseLibrary(SuperClassBase);
  197. CloseLibrary(XpkBase);
  198. CloseLibrary(RenderBase);
  199. }
  200.  
  201. IClass *ObtainClass(register __a6 ClassBase *cb)
  202. {
  203. return cb->cb_Class;
  204. }
  205.  
  206.